1 Chargement des données et mise en forme

1.1 Chargement

fait.dat <- read.csv("data/fait.txt")
implantation.dat <- read.csv("data/implantation.txt")
# on retire le num de ligne qui était passe en X
fait.dat <- subset(fait.dat, select = - X)
implantation.dat <- subset(implantation.dat, select = - X)

1.2 Mise en forme

relation.dat <- fait.dat[fait.dat$caracNew == "Relations" ,] # on ne garde que les relations
relation <- relation.dat[relation.dat$modAgreg != "A",] # on enleve les doublons
relation <- subset(relation, select =  c("idimplantation", "usual_name", "fklinked_implantation","linked_implantation_name")) # on ne garde que les noms et noms liées
# on drop les facteurs non pris en compte suite aux subset de relations
relation$usual_name <- factor(relation$usual_name)
relation$linked_implantation_name <- factor(relation$linked_implantation_name)

Dans un premier temps je ne vais travailler qu’avec les relations représentées par des couples noms d’implantations et noms d’implantations liées. Il s’agira par la suite de complexifier.

2 Description des relations

2.1 Quelques chiffres à garder en tête

2.1.1 Les relations directes

Cela recouvre 1370 relations directes car celles avec modAgreg == A ont été retirées (elles doublonnaient avec modAgreg == D). Il y a 305 implantations distinctes (idimplantation) qui sont liées à 1087 implantations liées distinctes (fklinked_implantation).

Le tableau 2.1 et le diagramme en baton 2.1 représentent le nombre de relations que l’on a pour chaque noms d’implantations distincts (idimplantation). Il y a deux implantations (Charroux, Saint-Sauveur et Cluny) qui possèdent 124 et 83 relations puis on obtient un second groupe d’implantations avec un nombre de relations contenues entre 38 et 20. Ensuite les nombre d’implantations possedant de moins en moins de relations va augmenter, presque exponentiellement pour culminer au groupe d’implantations ne possedant qu’une relation (155).

# un tableau avec les Id et les noms
idimplant_court <- subset(implantation.dat, select = c(idimplantation, usual_name))

implantation_relation <- relation %>% 
    group_by(idimplantation) %>% # on groupe par usual name
    summarize(nb = n()) %>%  # on compte par ce group
    arrange(desc(nb)) %>% # on passe en decroissant
    left_join(idimplant_court,by = "idimplantation") # ion rajoute le nom
# une bidouille pour avoir un titre de tableau avec ref
cat("<tableau>",paste0("<caption>", "(#tab:relationusualname)", ' Nombre de relations directes par idimplantation', "</caption>"),"</tableau>", sep ="\n")
Table 2.1: Nombre de relations directes par idimplantation

DT::datatable(implantation_relation)
gg_implantation_relation <- ggplot(implantation_relation) +
        geom_bar(aes(nb)) + 
        labs(x = "", y = "") +
        theme_bw()
# c'est du js
f <- list(
  family = "Courier New, monospace",
  size = 18,
  color = "#7f7f7f"
)
x <- list(
  title = "Nombre de relations par idimplantation",
  titlefont = f
)
y <- list(
  title = "décompte",
  titlefont = f
)
ggplotly(gg_implantation_relation) %>% 
    layout(xaxis = x, yaxis = y)

Figure 2.1: Diagramme en baton du nombre de relations directes par idimplantation

2.1.2 une carte des implantations par nombre de relations directes

initmapview()
 mapview::mapview(diocese.shp, color = "white",  lwd = 1, # couleur et type du contour
                      col.regions = "grey",  alpha = 0.5,                  # couleur du fond et type
                      layer.name = "Diocèses" ) +
 mapview::mapview(implantation.shp, cex = 0.1, layer.name = "Implantations", col.regions = "black") +
 mapview::mapview(implantation_relation.shp, cex = "nb", layer.name = "implantations avec relations")
## Warning in validateCoords(lng, lat, funcName): Data contains 18 rows with
## either missing or invalid lat/lon values and will be ignored

Comme le message d’erreur l’indique il y a 18 implantations dont on ne posséde par les coordonnées.

3 Des graphs

3.1 Un graph non orienté pour commencer

# je prefere des caracteres donc autant garder une syntaxe V pour vertex
relation_graph <- subset(relation, select = c(idimplantation, fklinked_implantation))
relation_graph$idimplantation <-  paste0("V", relation_graph$idimplantation)
relation_graph$fklinked_implantation <- paste0("V", relation_graph$fklinked_implantation)

implantation.dat$name <- paste0("V", implantation.dat$idimplantation)

# on garde pas tout, il est important que le première colonne contienne les noms de vertex cf help(grap.data.frame)
implantationVertex.dat <- implantation.dat[,c(16,2,3,9:11)] 


# le match est un peu tricky ici car utilisé pour réduire (et ordonner ce qui ne change rien) au vertex ayant des relations
implantationVertexv2.dat <- implantationVertex.dat[match(unique(c(relation_graph$idimplantation, 
                                                        relation_graph$fklinked_implantation)), implantationVertex.dat$name),]
graph_relation <- graph.data.frame(relation_graph, 
                                   directed = FALSE, 
                                   vertices = implantationVertexv2.dat) # c'est ici qu' on indique les attributs des vertex, il faut que la première colonne corresponde à celle des vertexes cf help(graph.data.frame) details 3 paragraphs

E(graph_relation)$weight <- 1
# on fait le nouveau graph avec le poids 
graph_ensemble_simplify <- simplify(graph_relation, edge.attr.comb = "sum") 

Le graph que l’on obtient comporte des liens doubles (209), c’est à dire que l’on peut avoir plusieurs relations entre deux noeuds (implantations). C’est logique vu que le relations et les implantations peuvent évoluer au cours du temps. C’est quelque chose que nous allons devoir observer plus en detail. Dans un premier temps, une solution est de les regrouper pour en faire un “poid”, plus ce poids est importants plus ces implantations possèdent des relations (cela suppose de mettre en équivalance les relations sur le principe d’une relation = une relation).

Plus étrange il y a une “boucle”, c’est à dire une relation entre une meme implantation :

# on regarde à quoi elle correspond
relation.dat[relation.dat$idimplantation == 102 & relation.dat$fklinked_implantation == 102,]
##      idfactoid idimplantation   usual_name caracteristique  caracNew
## 8711     17256            102 Saint-Mansuy       Relations Relations
##      modAgreg              modalite fklinked_implantation
## 8711        H Association de prière                   102
##      linked_implantation_name date_start_min date_start_max date_stop_min
## 8711             Saint-Mansuy            982            982           982
##      date_stop_max   lat  lng location_granularity Diocese date_startC
## 8711           982 48.68 5.89              precise    Toul         982
##      date_stopC DureeFact
## 8711        982         0

En tenant donc compte de cette boucle et de ces 209 liens multiple on obtient 1160 liens.

#on en fait un tableau
lien_unique.dat <- data.frame(
    V(graph_ensemble_simplify)$name, # la première colonne correspond au nom de vertexes
    degree(graph_ensemble_simplify)) # la seconde au degrée,
names(lien_unique.dat) <- c("name", "lien_unique") # on renome ces colonnes
# puis on en fait une jointure sur les implantations
lien_unique_join.dat <- left_join(lien_unique.dat, implantationVertex.dat, by = c("name"="name"))
## Warning: Column `name` joining factor and character vector, coercing into
## character vector
DT::datatable(lien_unique_join.dat)

3.2 Une première visualisation.

On a observe différents types des clusters : des très petits groupes de quelques relations (parfois juste une) et des groupes très étoilées d’un grand nombre d’implantations.

Plus la couleur du lien est bleu plus ce lien à un poids forts (c’est à dire plus il y a de relations entre ces deux implantations).

# une palette de couleur
edge_pal <- colorRampPalette(c( "forestgreen", "blue"))

# on va attribué une couleur en fonction du log du poids (je suis pas satisfait il me faut faire des verifs)
E(graph_ensemble_simplify)$colorW <- edge_pal(10)[as.numeric(cut(
                                      log(E(graph_ensemble_simplify)$weight + 1 ),
                                       breaks = 10))]

V(graph_ensemble_simplify)$colorV <- "gray60"

graphjs(graph_ensemble_simplify, 
        vertex.label = V(graph_ensemble_simplify)$usual_name, # ici on mets le nom de l'implantation
        vertex.color = V(graph_ensemble_simplify)$colorV, # la couleur pour les vertexs
        vertex.size = 0.1, # on reduit la taille
        edge.color = E(graph_ensemble_simplify)$colorW) # on reutilise le vecteur de couleurs ici que trois couleurs produites ..